/*
 * Copyright (c) 2005 Psiqueware. All Rights Reserved.
 */

package com.psiqueware.alheli.prueba.modelo;

import com.psiqueware.alheli.dao.ConnectionException;
import com.psiqueware.alheli.dao.DAOException;
import com.psiqueware.alheli.dao.EnlaceTransaccional;
import com.psiqueware.alheli.dao.logger.dao.LogMessageDAO;
import com.psiqueware.alheli.dao.logger.dao.LogThrowableDAO;
import com.psiqueware.alheli.dao.logger.dao.LoggingDAOFactory;
import com.psiqueware.alheli.dao.logger.dao.hbm.LogMessageDAOHbmC;
import com.psiqueware.alheli.logging.Logger;
import com.psiqueware.alheli.logging.LoggerFactory;
import com.psiqueware.alheli.logging.log4j.LogMessage;
import com.psiqueware.alheli.logging.log4j.LogThrowable;
import com.psiqueware.alheli.prueba.UsuarioPrueba;
import com.psiqueware.alheli.prueba.modelo.dao.hibernate.UsuarioPruebaDAOHbmA;
import com.psiqueware.alheli.prueba.modelo.dao.hibernate.UsuarioPruebaDAOHbmC;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;


/**
 * Created by IntelliJ IDEA. User: Psique Date: 12-oct-2005 Time: 19:09:00 To change this template use File | Settings |
 * File Templates.
 */

public final class PruebaHibernate
{

    /**
     * LogMessage para esta clase.
     */
    private static final Logger s_log = LoggerFactory.getLogger(PruebaHibernate.class);

    /**
     * Construye una PruebaHibernate.
     * No requiere argumentos.
     */
    public PruebaHibernate()
    {

    }

    /**
     * Ejecuta la prueba de hibernate
     *
     * @param args
     */
    public static void main(String[] args) throws DAOException
    {

        //pruebaHibernateLogThrowable();
        PruebaHibernate ph = new PruebaHibernate();
        ph.pruebaHibernateAnnotations();

    }

    /**
     * Prueba de Annotations.
     */
    private void pruebaHibernateAnnotations()
    {
        final com.psiqueware.alheli.prueba.modelo.dao.UsuarioPruebaDAO dao = new UsuarioPruebaDAOHbmA();
        final EnlaceTransaccional enlaceTransaccional = dao.nuevoEnlaceTransaccional();

        UsuarioPruebaK up = new UsuarioPruebaK();
        up.setAlta(new Date());
        up.setCorreoElectronico("CorreoE");
        up.setNombre("Pepe");
        up.setPaterno("Pecas");
        try
        {
            enlaceTransaccional.iniciaTransaccion();
            if (s_log.isDebugEnabled()) s_log.debug("Antes de insertar:");
            List<UsuarioPrueba> list = dao.listUsuarioPrueba(enlaceTransaccional);
            for (UsuarioPrueba usuarioPrueba : list)
            {
                s_log.warn(usuarioPrueba);
            }

            dao.saveUsuarioPrueba(up, enlaceTransaccional);
            if (s_log.isDebugEnabled()) s_log.debug("Despues de insertar:");
            list = dao.listUsuarioPrueba(enlaceTransaccional);
            for (UsuarioPrueba usuarioPrueba : list)
            {
                s_log.warn(usuarioPrueba);
            }
        }
        catch (Exception e)
        {
            final String error = "<error><msg>No se pudo dar de alta el UsuarioPruebas</msg></error>";
            s_log.error(error);
            s_log.error(e);
            enlaceTransaccional.rollBack();
            throw new RuntimeException(error, e);
        }
        finally
        {
            enlaceTransaccional.finalizaTransaccion();
        }


    }


    private void pruebaHibernateLogThrowable() throws DAOException
    {
        s_log.warn("Iniciada la prueba.");

        UsuarioPruebaDAOHbmC dao = new UsuarioPruebaDAOHbmC();
        s_log.warn("Pedimos listado");
        final EnlaceTransaccional enlaceTransaccional = dao.nuevoEnlaceTransaccional();
        List list = dao.listUsuarioPrueba(enlaceTransaccional);
        s_log.warn("Iteramos.");

        Iterator it = list.iterator();
        while (it.hasNext())
        {
            s_log.info(it.next());
        }

        s_log.warn("Logs");
        LogMessageDAO logDAOHbm = new LogMessageDAOHbmC();
        try
        {
            s_log.info("Logs registrados = " + logDAOHbm.listLogMessage(enlaceTransaccional).size());
        }
        catch (DAOException e)
        {
            String error = "Error recuperando los logs.";
            s_log.error(error);
            throw new RuntimeException(error, e);

        }

        //Tronamos la aplicaci&oacute;n.
        try
        {
            throw new ConnectionException("Excepci&oacute;n de Prueba.");
        }
        catch (ConnectionException e)
        {

            try
            {
                throw new DAOException("Anidada", e);
            }
            catch (DAOException e1)
            {
                String error = "Probando el dao de excepciones.";
                s_log.error(error);
                s_log.error(e1);
                try
                {
                    throw new Exception(error, e1);
                }
                catch (Exception e2)
                {
                    error = "Otra Excepcion";
                    s_log.error(error);
                    s_log.error(e2);

                }

            }


            List logThrowables = new ArrayList();
            LogThrowable logThrowable = new LogThrowable();
            logThrowable.setError("Error1");
            logThrowable.setMessage("Tenemos  un Error1");
            logThrowables.add(logThrowable);
            logThrowable = new LogThrowable();
            logThrowable.setError("Error2");
            logThrowable.setMessage("Tenemos  un Error2");
            logThrowables.add(logThrowable);
            logThrowable = new LogThrowable();
            logThrowable.setError("Error3");
            logThrowable.setMessage("Tenemos  un Error3");
            logThrowables.add(logThrowable);

            LogMessage logMessage = new LogMessage();
            logMessage.setArchivo("Archivo");
            logMessage.setClase("Clase");
            logMessage.setFecha(new Date());
            logMessage.setLogger("Logger");
            logMessage.setLogThrowables(logThrowables);
            logMessage.setMensaje("Mensaje");
            logMessage.setMetodo("Metodo");
            logMessage.setNivel(1);
            logMessage.setThread("Thread");


            LogMessageDAO logMessageDAO = LoggingDAOFactory.findDAOLogMessage(enlaceTransaccional);
            LogThrowableDAO logThrowableDAO = LoggingDAOFactory.findDAOLogThrowable(enlaceTransaccional);

            try
            {
                for (Iterator iterator = logThrowables.iterator(); iterator.hasNext(); )
                {
                    LogThrowable throwable = (LogThrowable) iterator.next();
                    logThrowableDAO.saveLogThrowable(throwable, enlaceTransaccional);
                }
                logMessageDAO.saveLogMessage(logMessage, enlaceTransaccional);
            }
            catch (DAOException e1)
            {
                String error = "No se pudo persistir el LogThorwable";
                s_log.error(error);
                s_log.error(e1);
                throw new RuntimeException(error, e1);

            }


        }
    }
}
